home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1994 #2 / Monster Media No. 2 (Monster Media)(1994).ISO / prog_c / tpchal_1.zip / RBS_0.C2 < prev    next >
Text File  |  1994-05-21  |  2KB  |  78 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. main()
  5. {
  6.       long n, div;
  7.       int posn, I;
  8.  
  9. #ifdef TEST
  10.       for (I = 0; I < 200; ++I)
  11.       {
  12. #endif
  13.             for (posn = 2, div = 10000000L; posn < 10; ++posn, div /= 10)
  14.             {
  15.                   unsigned dig;
  16.                   long x, permute(void);
  17.  
  18.                   n = permute();
  19.                   if (0L != (x = ((n / div) % posn)))
  20.                   {
  21.                         n += (posn - x) * div;
  22.                         n -= n % div;
  23.                         posn = 1;
  24.                         div = 100000000L;
  25.                         continue; 
  26.                   }
  27.             }
  28. #ifdef TEST
  29.       }
  30. #endif
  31.       printf("Number = %lu\n", n);
  32.       return 0;
  33.  
  34. const char odds[] = "1379", evens[] = "2468";
  35.  
  36. long permute(void)
  37. {
  38.       static char number[] = "    5    ";
  39.       static char *peven = NULL, *podd = NULL;
  40.       static unsigned eskip = 1, oskip = 1;
  41.       int i;
  42.  
  43.       if (!peven)
  44.             peven = (char *)evens;
  45.       if (!podd)
  46.             podd  = (char *)odds;
  47.  
  48.       for (i = 0; i < 9; )
  49.       {
  50.             if (i & 1)
  51.             {
  52.                   while (((peven += eskip) - (char *)evens) >= 4)
  53.                         peven -= 4;
  54.                   number[i++] = *peven;
  55.             }
  56.             else
  57.             {
  58.                   while (((podd += oskip) - (char *)odds) >= 4)
  59.                         podd -= 4;
  60.                   number[i++] = *podd;
  61.             }
  62.             if (4 == i)
  63.                   ++i;
  64.       }
  65.       if (!(4 > ++eskip))
  66.       {
  67.             peven = (char *)evens;
  68.             eskip = 1;
  69.             if (!(4 > ++oskip))
  70.             {
  71.                   podd = (char *)odds;
  72.                   oskip = 1;
  73.             }
  74.       }
  75.       return atol(number);
  76. }
  77.